{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# K-nearest neighbors and scikit-learn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Agenda\n",
    "\n",
    "1. Review of the iris dataset\n",
    "2. Human learning on the iris dataset\n",
    "3. K-nearest neighbors (KNN) classification\n",
    "4. Review of supervised learning\n",
    "5. Benefits and drawbacks of scikit-learn\n",
    "6. Requirements for working with data in scikit-learn\n",
    "7. scikit-learn's 4-step modeling pattern\n",
    "8. Tuning a KNN model\n",
    "9. Comparing KNN with other models\n",
    "\n",
    "## Lesson goals\n",
    "\n",
    "1. Learn how the modeling process works\n",
    "2. Learn how scikit-learn works\n",
    "3. Learn how KNN works"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Review of the iris dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# read the iris data into a DataFrame\n",
    "import pandas as pd\n",
    "url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'\n",
    "col_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']\n",
    "iris = pd.read_csv(url, header=None, names=col_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>species</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal_length  sepal_width  petal_length  petal_width      species\n",
       "0           5.1          3.5           1.4          0.2  Iris-setosa\n",
       "1           4.9          3.0           1.4          0.2  Iris-setosa\n",
       "2           4.7          3.2           1.3          0.2  Iris-setosa\n",
       "3           4.6          3.1           1.5          0.2  Iris-setosa\n",
       "4           5.0          3.6           1.4          0.2  Iris-setosa"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Terminology\n",
    "\n",
    "- **150 observations** (n=150): each observation is one iris flower\n",
    "- **4 features** (p=4): sepal length, sepal width, petal length, and petal width\n",
    "- **Response**: iris species\n",
    "- **Classification problem** since response is categorical"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Human learning on the iris dataset\n",
    "\n",
    "How did we (as humans) predict the species of an iris?\n",
    "\n",
    "1. We observed that the different species had (somewhat) dissimilar measurements.\n",
    "2. We focused on features that seemed to correlate with the response.\n",
    "3. We created a set of rules (using those features) to predict the species of an unknown iris.\n",
    "\n",
    "We assumed that if an **unknown iris** has measurements similar to **previous irises**, then its species is most likely the same as those previous irises."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# allow plots to appear in the notebook\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# increase default figure and font sizes for easier viewing\n",
    "plt.rcParams['figure.figsize'] = (6, 4)\n",
    "plt.rcParams['font.size'] = 14\n",
    "\n",
    "# create a custom colormap\n",
    "from matplotlib.colors import ListedColormap\n",
    "cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# map each iris species to a number\n",
    "iris['species_num'] = iris.species.map({'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x403a3c8>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n3CG9m9oAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x403a080>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create a scatter plot of PETAL LENGTH versus PETAL WIDTH and color by SPECIES\n",
    "iris.plot(kind='scatter', x='petal_length', y='petal_width', c='species_num', colormap=cmap_bold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xc14eb00>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc140668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# create a scatter plot of SEPAL LENGTH versus SEPAL WIDTH and color by SPECIES\n",
    "iris.plot(kind='scatter', x='sepal_length', y='sepal_width', c='species_num', colormap=cmap_bold)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K-nearest neighbors (KNN) classification"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. Pick a value for K.\n",
    "2. Search for the K observations in the data that are \"nearest\" to the measurements of the unknown iris.\n",
    "    - Euclidian distance is often used as the distance metric, but other metrics are allowed.\n",
    "3. Use the most popular response value from the K \"nearest neighbors\" as the predicted response value for the unknown iris."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### KNN classification map for iris (K=1)\n",
    "\n",
    "![1NN classification map](images/iris_01nn_map.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### KNN classification map for iris (K=5)\n",
    "\n",
    "![5NN classification map](images/iris_05nn_map.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### KNN classification map for iris (K=15)\n",
    "\n",
    "![15NN classification map](images/iris_15nn_map.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### KNN classification map for iris (K=50)\n",
    "\n",
    "![50NN classification map](images/iris_50nn_map.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question:** What's the \"best\" value for K in this case?\n",
    "\n",
    "**Answer:** The value which produces the most accurate predictions on **unseen data**. We want to create a model that generalizes!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Review of supervised learning\n",
    "\n",
    "![Supervised learning diagram](images/supervised_learning.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Benefits and drawbacks of scikit-learn\n",
    "\n",
    "**Benefits:**\n",
    "\n",
    "- Consistent interface to machine learning models\n",
    "- Provides many tuning parameters but with sensible defaults\n",
    "- Exceptional documentation\n",
    "- Rich set of functionality for companion tasks\n",
    "- Active community for development and support\n",
    "\n",
    "**Potential drawbacks:**\n",
    "\n",
    "- Harder (than R) to get started with machine learning\n",
    "- Less emphasis (than R) on model interpretability\n",
    "\n",
    "Ben Lorica: [Six reasons why I recommend scikit-learn](http://radar.oreilly.com/2013/12/six-reasons-why-i-recommend-scikit-learn.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Requirements for working with data in scikit-learn\n",
    "\n",
    "1. Features and response should be **separate objects**\n",
    "2. Features and response should be entirely **numeric**\n",
    "3. Features and response should be **NumPy arrays** (or easily converted to NumPy arrays)\n",
    "4. Features and response should have **specific shapes** (outlined below)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_length</th>\n",
       "      <th>sepal_width</th>\n",
       "      <th>petal_length</th>\n",
       "      <th>petal_width</th>\n",
       "      <th>species</th>\n",
       "      <th>species_num</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal_length  sepal_width  petal_length  petal_width      species  \\\n",
       "0           5.1          3.5           1.4          0.2  Iris-setosa   \n",
       "1           4.9          3.0           1.4          0.2  Iris-setosa   \n",
       "2           4.7          3.2           1.3          0.2  Iris-setosa   \n",
       "3           4.6          3.1           1.5          0.2  Iris-setosa   \n",
       "4           5.0          3.6           1.4          0.2  Iris-setosa   \n",
       "\n",
       "   species_num  \n",
       "0            0  \n",
       "1            0  \n",
       "2            0  \n",
       "3            0  \n",
       "4            0  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# store feature matrix in \"X\"\n",
    "feature_cols = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']\n",
    "X = iris[feature_cols]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# alternative ways to create \"X\"\n",
    "X = iris.drop(['species', 'species_num'], axis=1)\n",
    "X = iris.loc[:, 'sepal_length':'petal_width']\n",
    "X = iris.iloc[:, 0:4]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# store response vector in \"y\"\n",
    "y = iris.species_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "<type 'numpy.ndarray'>\n"
     ]
    }
   ],
   "source": [
    "# check X's type\n",
    "print type(X)\n",
    "print type(X.values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.series.Series'>\n",
      "<type 'numpy.ndarray'>\n"
     ]
    }
   ],
   "source": [
    "# check y's type\n",
    "print type(y)\n",
    "print type(y.values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(150, 4)\n"
     ]
    }
   ],
   "source": [
    "# check X's shape (n = number of observations, p = number of features)\n",
    "print X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(150L,)\n"
     ]
    }
   ],
   "source": [
    "# check y's shape (single dimension with length n)\n",
    "print y.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## scikit-learn's 4-step modeling pattern"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Step 1:** Import the class you plan to use"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Step 2:** \"Instantiate\" the \"estimator\"\n",
    "\n",
    "- \"Estimator\" is scikit-learn's term for \"model\"\n",
    "- \"Instantiate\" means \"make an instance of\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sklearn.neighbors.classification.KNeighborsClassifier"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# make an instance of a KNeighborsClassifier object\n",
    "knn = KNeighborsClassifier(n_neighbors=1)\n",
    "type(knn)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Created an object that \"knows\" how to do K-nearest neighbors classification, and is just waiting for data\n",
    "- Name of the object does not matter\n",
    "- Can specify tuning parameters (aka \"hyperparameters\") during this step\n",
    "- All parameters not specified are set to their defaults"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
      "           metric_params=None, n_neighbors=1, p=2, weights='uniform')\n"
     ]
    }
   ],
   "source": [
    "print knn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Step 3:** Fit the model with data (aka \"model training\")\n",
    "\n",
    "- Model is \"learning\" the relationship between X and y in our \"training data\"\n",
    "- Process through which learning occurs varies by model\n",
    "- Occurs in-place"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_neighbors=1, p=2, weights='uniform')"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Once a model has been fit with data, it's called a \"fitted model\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Step 4:** Predict the response for a new observation\n",
    "\n",
    "- New observations are called \"out-of-sample\" data\n",
    "- Uses the information it learned during the model training process"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2], dtype=int64)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.predict([3, 5, 4, 2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Returns a NumPy array, and we keep track of what the numbers \"mean\"\n",
    "- Can predict for multiple observations at once"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2, 1], dtype=int64)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_new = [[3, 5, 4, 2], [5, 4, 3, 2]]\n",
    "knn.predict(X_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tuning a KNN model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1], dtype=int64)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# instantiate the model (using the value K=5)\n",
    "knn = KNeighborsClassifier(n_neighbors=5)\n",
    "\n",
    "# fit the model with data\n",
    "knn.fit(X, y)\n",
    "\n",
    "# predict the response for new observations\n",
    "knn.predict(X_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Question:** Which model produced the correct predictions for the two unknown irises?\n",
    "\n",
    "**Answer:** We don't know, because these are **out-of-sample observations**, meaning that we don't know the true response values. Our goal with supervised learning is to build models that generalize to out-of-sample data. However, we can't truly measure how well our models will perform on out-of-sample data.\n",
    "\n",
    "**Question:** Does that mean that we have to guess how well our models are likely to do?\n",
    "\n",
    "**Answer:** Thankfully, no. In the next class, we'll discuss **model evaluation procedures**, which allow us to use our existing labeled data to estimate how well our models are likely to perform on out-of-sample data. These procedures will help us to tune our models and choose between different types of models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0. ,  0.8,  0.2],\n",
       "       [ 0. ,  1. ,  0. ]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# calculate predicted probabilities of class membership\n",
    "knn.predict_proba(X_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comparing KNN with other models"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Advantages of KNN:**\n",
    "\n",
    "- Simple to understand and explain\n",
    "- Model training is fast\n",
    "- Can be used for classification and regression\n",
    "\n",
    "**Disadvantages of KNN:**\n",
    "\n",
    "- Must store all of the training data\n",
    "- Prediction phase can be slow when n is large\n",
    "- Sensitive to irrelevant features\n",
    "- Sensitive to the scale of the data\n",
    "- Accuracy is (generally) not competitive with the best supervised learning methods"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
